From f6e0c2f73b95a358259a1c0f2b2dc7d8d9a73ac3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 17 Aug 2016 23:31:29 +0300 Subject: [PATCH] Don't use Resolve.root when checking for cycles --- src/cargo/core/resolver/mod.rs | 25 +++++++++++++++++-------- tests/build.rs | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index c774481f1..d796a5c72 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -980,15 +980,24 @@ impl<'a> Context<'a> { fn check_cycles(resolve: &Resolve, activations: &HashMap<(String, SourceId), Vec>>) -> CargoResult<()> { - let mut summaries = HashMap::new(); - for summary in activations.values().flat_map(|v| v) { - summaries.insert(summary.package_id(), &**summary); + let summaries: HashMap<&PackageId, &Summary> = activations.values() + .flat_map(|v| v) + .map(|s| (s.package_id(), &**s)) + .collect(); + + // Sort packages to produce user friendly deterministic errors. + let all_packages = resolve.iter().collect::>().into_sorted_vec(); + let mut checked = HashSet::new(); + for pkg in all_packages { + if !checked.contains(pkg) { + try!(visit(resolve, + pkg, + &summaries, + &mut HashSet::new(), + &mut checked)) + } } - return visit(resolve, - resolve.root(), - &summaries, - &mut HashSet::new(), - &mut HashSet::new()); + return Ok(()); fn visit<'a>(resolve: &'a Resolve, id: &'a PackageId, diff --git a/tests/build.rs b/tests/build.rs index 4f74335b8..4844eae53 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -1887,7 +1887,7 @@ fn cyclic_deps_rejected() { assert_that(p.cargo_process("build").arg("-v"), execs().with_status(101) .with_stderr("\ -[ERROR] cyclic package dependency: package `foo v0.0.1 ([..])` depends on itself +[ERROR] cyclic package dependency: package `a v0.0.1 ([..])` depends on itself ")); } -- 2.30.2